package com.data.JVM.chapter08;
/**
 * 静态分派：发生在编译阶段，实际上不是虚拟机来执行
 * 依赖静态类型来定位方法的版本的分派动作    -======应用=========>方法重载
 */
public class StaticDispatcher {


    static abstract class Human{}
    static  class Man extends Human{}
    static  class Woman extends Human{}

    /**
     * 重载方法
     * @param guy
     */
    public void sayHello(Human guy){
        System.out.println("hei  guy");
    }
    public void sayHello(Man man){
        System.out.println("hei  Man");
    }
    public void sayHello(Woman woman){
        System.out.println("hei  Woman");
    }

    public static void main(String[] args) {


        /**
         * Human为变量的静态类型   静态类型变化仅仅在使用时发生改变，变量本身静态类型不会改变，并且最终的静态类型在编译期可知
         *
         * new Man()为 变量实际类型  编译器在编译程序的时候并不知道一个对象的实际类型是什么。
         *
         *
         * 虚拟机（编译器）在重载时，是通过参数的静态类型而不是动态类型作为判断依据的，静态类型是编译期可知的
         */
        Human man = new Man() ;
        Human woman  =new Woman();


        StaticDispatcher sr = new StaticDispatcher();
//        sr.sayHello(new Man());
//        sr.sayHello(new Woman());
        sr.sayHello(man);
        sr.sayHello(woman );
    }


}
